#include "test_list.h"


#ifdef TEST_VARIANT_STEP

#include "disable_warning.h"

#include "tools/variant.h"

#define TEST_VARIANT_STEP_000
#define TEST_VARIANT_STEP_001
#define TEST_VARIANT_STEP_002
#define TEST_VARIANT_STEP_003
#define TEST_VARIANT_STEP_004
#define TEST_VARIANT_STEP_005
#define TEST_VARIANT_STEP_006
#define TEST_VARIANT_STEP_007
#define TEST_VARIANT_STEP_008
#define TEST_VARIANT_STEP_009
#define TEST_VARIANT_STEP_010
#define TEST_VARIANT_STEP_011
#define TEST_VARIANT_STEP_012
#define TEST_VARIANT_STEP_013
#define TEST_VARIANT_STEP_014
#define TEST_VARIANT_STEP_015
#define TEST_VARIANT_STEP_016
#define TEST_VARIANT_STEP_017
#define TEST_VARIANT_STEP_018
#define TEST_VARIANT_STEP_019
#define TEST_VARIANT_STEP_020
#define TEST_VARIANT_STEP_021
#define TEST_VARIANT_STEP_022
#define TEST_VARIANT_STEP_023
#define TEST_VARIANT_STEP_024
#define TEST_VARIANT_STEP_025
#define TEST_VARIANT_STEP_026
#define TEST_VARIANT_STEP_027
#define TEST_VARIANT_STEP_028
#define TEST_VARIANT_STEP_029
#define TEST_VARIANT_STEP_030
#define TEST_VARIANT_STEP_031
#define TEST_VARIANT_STEP_032

using namespace variant_detail;

//------------------------------------------------------------------------------------------------------//
namespace{

    typedef variant_detail::V::I8         I8;
    typedef variant_detail::V::I16        I16;
    typedef variant_detail::V::I32        I32;
    typedef variant_detail::V::I64        I64;
    typedef variant_detail::V::U8         U8;
    typedef variant_detail::V::U16        U16;
    typedef variant_detail::V::U32        U32;
    typedef variant_detail::V::U64        U64;
    typedef variant_detail::V::F32        F32;
    typedef variant_detail::V::F64        F64;
    typedef variant_detail::V::Byte       Byte;
    typedef variant_detail::V::WChar      WChar;
    typedef variant_detail::V::Str        Str;
    typedef variant_detail::V::WStr       WStr;
    typedef variant_detail::V::Vec        Vec;
    typedef variant_detail::V::Map        Map;
    typedef variant_detail::V::Blob       Blob;
    typedef variant_detail::V::List       List;

}//namespace



//------------------------------------------------------------------------------------------------------//

#ifdef TEST_VARIANT_STEP_000
TEST(Variant, step_000)
{
    Vec vec;
    vec.push_back( V::I32(10) );
    vec.push_back( V::I32(20) );

    Step<Vec,Vec::iterator, DIRECT_NORMAL> st( vec.begin() );

    EXPECT_EQ(10, st.GetVariant().Get<V::I32>() );
    EXPECT_EQ("", st.GetKey() );

    st.Right();

    EXPECT_EQ(20, st.GetVariant().Get<V::I32>() );
    EXPECT_EQ("", st.GetKey() );
}
#endif // TEST_VARIANT_STEP_000

#ifdef TEST_VARIANT_STEP_001
TEST(Variant, step_001)
{
    Vec vec;
    vec.push_back( V::I32(10) );
    vec.push_back( V::I32(20) );

    Step<Vec,Vec::iterator, DIRECT_NORMAL> st( vec.end() );
    st.Left();

    EXPECT_EQ(20, st.GetVariant().Get<V::I32>() );
    EXPECT_EQ("", st.GetKey() );

    st.Left();

    EXPECT_EQ(10, st.GetVariant().Get<V::I32>() );
    EXPECT_EQ("", st.GetKey() );
}
#endif // TEST_VARIANT_STEP_001

#ifdef TEST_VARIANT_STEP_002
TEST(Variant, step_002)
{
    Vec vec;
    vec.push_back( V::I32(10) );
    vec.push_back( V::I32(20) );

    Step<Vec,Vec::reverse_iterator, DIRECT_NORMAL> st( vec.rbegin() );

    EXPECT_EQ(20, st.GetVariant().Get<V::I32>() );
    EXPECT_EQ("", st.GetKey() );

    st.Right();

    EXPECT_EQ(10, st.GetVariant().Get<V::I32>() );
    EXPECT_EQ("", st.GetKey() );
}
#endif // TEST_VARIANT_STEP_002

#ifdef TEST_VARIANT_STEP_003
TEST(Variant, step_003)
{
    Vec vec;
    vec.push_back( V::I32(10) );
    vec.push_back( V::I32(20) );

    Step<Vec,Vec::reverse_iterator, DIRECT_NORMAL> st( vec.rend() );

    st.Left();
    EXPECT_EQ(10, st.GetVariant().Get<V::I32>() );
    EXPECT_EQ("", st.GetKey() );

    st.Left();
    EXPECT_EQ(20, st.GetVariant().Get<V::I32>() );
    EXPECT_EQ("", st.GetKey() );
}
#endif // TEST_VARIANT_STEP_003

#ifdef TEST_VARIANT_STEP_004
#endif // TEST_VARIANT_STEP_004

#ifdef TEST_VARIANT_STEP_005
#endif // TEST_VARIANT_STEP_005

#ifdef TEST_VARIANT_STEP_006
#endif // TEST_VARIANT_STEP_006

#ifdef TEST_VARIANT_STEP_007
#endif // TEST_VARIANT_STEP_007

#ifdef TEST_VARIANT_STEP_008
#endif // TEST_VARIANT_STEP_008

#ifdef TEST_VARIANT_STEP_009
#endif // TEST_VARIANT_STEP_009

#ifdef TEST_VARIANT_STEP_010
//TEST(Variant, step_010)
//{
//    Map mp;
//    mp["one"] = V::I32(10);
//    mp["two"] = V::I32(20);

//    Step<Map, DIRECT_NORMAL> st( mp.begin() );

//    EXPECT_EQ(10, st.GetVariant().Get<V::I32>() );
//    EXPECT_EQ("one", st.GetKey() );

//    st.Right();

//    EXPECT_EQ(20, st.GetVariant().Get<V::I32>() );
//    EXPECT_EQ("two", st.GetKey() );
//}

#endif // TEST_VARIANT_STEP_010

#ifdef TEST_VARIANT_STEP_011
#endif // TEST_VARIANT_STEP_011

#ifdef TEST_VARIANT_STEP_012
#endif // TEST_VARIANT_STEP_012

#ifdef TEST_VARIANT_STEP_013
#endif // TEST_VARIANT_STEP_013

#ifdef TEST_VARIANT_STEP_014
#endif // TEST_VARIANT_STEP_014

#ifdef TEST_VARIANT_STEP_015
#endif // TEST_VARIANT_STEP_015

#ifdef TEST_VARIANT_STEP_016
#endif // TEST_VARIANT_STEP_016

#ifdef TEST_VARIANT_STEP_017
#endif // TEST_VARIANT_STEP_017

#ifdef TEST_VARIANT_STEP_018
#endif // TEST_VARIANT_STEP_018

#ifdef TEST_VARIANT_STEP_019
#endif // TEST_VARIANT_STEP_019

#ifdef TEST_VARIANT_STEP_020
#endif // TEST_VARIANT_STEP_020

#ifdef TEST_VARIANT_STEP_021
#endif // TEST_VARIANT_STEP_021

#ifdef TEST_VARIANT_STEP_022
#endif // TEST_VARIANT_STEP_022

#ifdef TEST_VARIANT_STEP_023
#endif // TEST_VARIANT_STEP_023

#ifdef TEST_VARIANT_STEP_024
#endif // TEST_VARIANT_STEP_024

#ifdef TEST_VARIANT_STEP_025
#endif // TEST_VARIANT_STEP_025

#ifdef TEST_VARIANT_STEP_026
#endif // TEST_VARIANT_STEP_026

#ifdef TEST_VARIANT_STEP_027
#endif // TEST_VARIANT_STEP_027

#ifdef TEST_VARIANT_STEP_028
#endif // TEST_VARIANT_STEP_029

#ifdef TEST_VARIANT_STEP_030
#endif // TEST_VARIANT_STEP_030

#ifdef TEST_VARIANT_STEP_031
#endif // TEST_VARIANT_STEP_031

#ifdef TEST_VARIANT_STEP_032
#endif // TEST_VARIANT_STEP_032

#include "default_warning.h"

#endif



